home *** CD-ROM | disk | FTP | other *** search
/ Day Cry / Day Cry CD.bin / oh_towns / ugoku / src.lzh / MOVDEMO / MOVDEMO.C < prev    next >
Text File  |  1994-09-09  |  18KB  |  747 lines

  1. /*
  2.             MOV SYSTEM DEMO PLAY
  3.  
  4.             Hiroshi TODA
  5.             1992 2/7
  6.  
  7. */
  8.  
  9. #include <stdio.h>
  10. #include <stdlib.h>
  11. #include <egb.h>
  12. #include <mos.h>
  13. #include <cdrfrb.h>
  14. #include <snd.h>
  15. #include "video.h"
  16. #include "ugoku.h"
  17.  
  18. #define C_WT 0x7fff        /* âJü[â\âï color */
  19. #define C_PL 0            /* Åëè·âvâîü[âô color */
  20. #define C_FL 0x303030        /* files back color */
  21. #define C_COLOR 15        /* Command color palette */
  22. #define W_COLOR 8        /* Window color palette */
  23. #define B_COLOR 7        /* Back color palette */
  24. #define E_COLOR 10        /* ERROR color palette */
  25. #define P_COLOR 12        /* PLAY color palette */
  26.  
  27. extern unsigned int VSYNC_counter;    /* vsync counter */
  28.  
  29. int sw = 0, cx = 0, cy = 0;    /* MOUSE data */
  30.  
  31. char directory[100] ;
  32. char newDirectory[100] ;
  33. char otherDriveDirectory[100] ;
  34. int driveNum ;
  35. char para[256];        /* PARAM */
  36. char gwork[1024];    /* Ä⌐ë╞É╗ graphic work */
  37. char swork[16384];    /* SND work */
  38. char ework[1536];    /* EGB work */
  39. char mwork[4096];    /* MOUSE work */
  40.  
  41. void ini()
  42. {
  43.  
  44.     extern int getCurrentDisk() ;
  45. /*    extern int get_directory( int drive, char *path_name_address );    */
  46.  
  47.     SND_init(swork);
  48.     SND_elevol_init();
  49.     SND_elevol_mute(0x03);
  50.     SND_elevol_set( 1, 127, 127 );
  51.  
  52.     EGB_init(ework,1536);            /* graph ini */
  53.     EGB_resolution(ework,0,10);        /* 2ëµû╩ìçɼ */
  54.     EGB_resolution(ework,1,10);
  55.     EGB_displayPage(ework,0,3);
  56.     EGB_writePage(ework,0);            /* ëµû╩0É▌ÆΦ */
  57.     EGB_displayStart(ework,2,2,2);
  58.     EGB_displayStart(ework,3,320,240);
  59.     EGB_writePage(ework,1);         /* ëµû╩1É▌ÆΦ */
  60.     EGB_displayStart(ework,2,2,2);
  61.     EGB_displayStart(ework,3,320,240);
  62.  
  63. //    MOS_start(mwork,4096);            /* mouse ini */
  64. //    MOS_resolution(0,10);
  65. //    MOS_resolution(1,3);
  66. //    MOS_writePage(1);
  67. //    MOS_horizon(0,639);
  68. //    MOS_vertical(0,479);
  69. //    MOS_disp(0);
  70. //    MOS_setpos( 320, 240 );
  71.  
  72.     DWORD(para+0) = 0;            /* key ini */
  73.     keyin(gwork,para);
  74.     DWORD(para+0) = 0x0200;            /* ASCII code */
  75.     DWORD(para+4) = 0;
  76.     DWORD(para+8) = 0;
  77.     DWORD(para+12) = 0;
  78.     keyin(gwork,para);
  79.  
  80.     int drv ;
  81.  
  82.     drv = getCurrentDisk() ;
  83.     driveNum = drv ;
  84.     directory[0] = 0x41 + drv ;
  85.     directory[1] = ':' ;
  86.     directory[2] = '\\' ;
  87.     get_directory( drv + 1, directory + 3 );
  88.  
  89.     otherDriveDirectory[0] = 0 ;
  90. }
  91.  
  92. void end()
  93. {
  94.     extern int changeCurrentDirectory( char *path_name_address ) ;
  95.     extern int changeDisk( int ) ;
  96.  
  97. //    MOS_end();
  98.     EGB_init(ework,1536);
  99.     DWORD(para+0) = 0;
  100.     SND_elevol_mute(0);
  101.     SND_end();
  102.     keyin(gwork,para);
  103.  
  104.     if( otherDriveDirectory[0] )
  105.         changeCurrentDirectory( otherDriveDirectory ) ;
  106.     changeCurrentDirectory( directory ) ;
  107.     changeDisk( driveNum ) ;
  108.  
  109. }
  110.  
  111. /*
  112. mouse(mmd)
  113. int mmd;
  114. {
  115.     int s, x, y;
  116.  
  117.     do{
  118.         MOS_rdpos(&sw,&cx,&cy);
  119.     }while( sw == 0 );
  120.     if( mmd == 0 ){
  121.         do{
  122.             MOS_rdpos(&s,&x,&y);
  123.         }while( s );
  124.     }
  125.     return 0;
  126. }
  127. */
  128.  
  129. itochar(n,count,p)    /* n --> char p[count] */
  130. int n,count;
  131. char *p;
  132. {
  133.     char dsp[] = "0123456789ABCDEF";
  134.  
  135.     switch( count ){
  136.         case 8: *p++ = dsp[ n/10000000 ];
  137.             n = n % 10000000;
  138.         case 7: *p++ = dsp[ n/1000000 ];
  139.             n = n % 1000000;
  140.         case 6: *p++ = dsp[ n/100000 ];
  141.             n = n % 100000;
  142.         case 5: *p++ = dsp[ n/10000 ];
  143.             n = n % 10000;
  144.         case 4: *p++ = dsp[ n/1000 ];
  145.             n = n % 1000;
  146.         case 3: *p++ = dsp[ n/100 ];
  147.             n = n % 100;
  148.         case 2: *p++ = dsp[ n/10 ];
  149.             n = n % 10;
  150.         case 1: *p++ = dsp[ n ];
  151.             *p = (char)0;
  152.     }
  153.     return 0;
  154. }
  155.  
  156. /*
  157. gprint( p, x, y )
  158. char *p;
  159. int x,y;
  160. {
  161.     int i;
  162.     char dsp[86];
  163.  
  164.     EGB_writePage(ework,0);
  165.  
  166.     EGB_color(ework,0,C_COLOR);
  167.     EGB_color(ework,2,C_COLOR);
  168.  
  169.     WORD(dsp+0) = x;
  170.     WORD(dsp+2) = y;
  171.     for ( i=0 ; i<80 ; i++ ){
  172.         dsp[ i + 6 ] = (char)( BYTE( p + i ) );
  173.         if( dsp[ i + 6 ] == (char)0 )break;
  174.     }
  175.     WORD(dsp+4) = i;
  176.     EGB_writeMode(ework,0);
  177.     EGB_sjisString(ework,dsp);
  178.     return 0;
  179. }
  180. */
  181.  
  182. /****** MOV *****/
  183.  
  184. /*  playv  */
  185.  
  186.     /* chek func */
  187.  
  188. int p_mov_play_check()
  189. {
  190.     int sw;
  191.  
  192. /*    Æìê╙:sw ëƒé│éΩé─éóéΘé╞bit off ëƒé│éΩé─é╚éóé╞bit on     */
  193.  
  194.     SND_joy_in_1( 0xff, &sw );        /* end check */
  195.     sw = (sw ^ 0xff) & 0x30;
  196.     if( sw == 0 )return 0;
  197. c01:    SND_joy_in_1( 0xff, &sw );
  198.     sw = (sw ^ 0xff) & 0x30;
  199.     if( sw & 0x10 ){
  200.         while( sw == 0x30 ){
  201.             SND_joy_in_1( 0xff, &sw );
  202.             sw = (sw ^ 0xff) & 0x30;
  203.         }
  204.         if( sw == 0x20 )goto c02;
  205.         while( sw ){
  206.             SND_joy_in_1( 0xff, &sw );
  207.             sw = (sw ^ 0xff) & 0x30;
  208.             if( sw == 0x30 )break;
  209.         }
  210.         return 1;
  211.     }
  212. c02:    if( sw )goto c01;
  213.     return -1;
  214. }
  215.  
  216. /* on memory type */
  217.  
  218. p_mov_memory_play( name, wait, rep, page )
  219. char *name;
  220. int wait, rep;
  221. {
  222.     char *work ;
  223.     int frame,x0,y0,x1,y1,wsize;
  224.     int error;
  225.  
  226.     if( rep <= 0 )rep = 1 ;
  227.  
  228.     error
  229.      = mov_memory_play_init( name, p_mov_play_check,&frame,&x0,&y0,&x1,&y1,
  230.      &wsize );
  231.     if( error )goto vd10;
  232.  
  233.     if( (work = (char *)malloc( wsize+153600 )) == NULL ){
  234.         error = 7;
  235.         goto vd10;            /* out of memory */
  236.     }
  237.  
  238.         /* mute */
  239. //    int s ;
  240. //    SND_get_elevol_mute( &s ) ;
  241. //    SND_elevol_mute( s | 0x03 ) ;
  242.  
  243.     error = mov_memory_play_repeat( work, work+153600, name, page, wait, rep);
  244.  
  245. //    SND_elevol_mute( s ) ;
  246.  
  247.     free( work );
  248. vd10:
  249.     return error;
  250. }
  251.  
  252. /* disk read type */
  253.  
  254. p_mov_disk_play( name, wait, rep, page )
  255. char *name;
  256. int wait, rep;
  257. {
  258.     char *work ;
  259.     int frame,x0,y0,x1,y1,wsize;
  260.     int error;
  261.  
  262.     if( rep <= 0 )rep = 1 ;
  263.  
  264.     error
  265.      = mov_disk_play_init( name, p_mov_play_check,&frame,&x0,&y0,&x1,&y1,
  266.       &wsize );
  267.     if( error )goto vd10;
  268.  
  269.     if( (work = (char *)malloc( wsize+153600 )) == NULL ){
  270.         error = 7;
  271.         goto vd10;            /* out of memory */
  272.     }
  273.  
  274.         /* mute */
  275. //    int s ;
  276. //    SND_get_elevol_mute( &s ) ;
  277. //    SND_elevol_mute( s | 0x03 ) ;
  278.  
  279.     error = mov_disk_play_repeat( work, work+153600, name, page, wait, rep);
  280.  
  281. //    SND_elevol_mute( s ) ;
  282.  
  283.     free( work );
  284. vd10:
  285.     return error;
  286. }
  287.  
  288.  
  289. /* path = fullname(path) + name ìçɼ */
  290.  
  291. make_path_name( path, fulname, name )
  292. char path[], fulname[], name[];
  293. {
  294.     int i, k;
  295.  
  296.     for( k=0 ; k<80 ; k++ ){
  297.         path[k] = fulname[k];
  298.         if( path[k] == (char)0 )break;
  299.     }
  300.     for( i=k ; i>=0 ; i-- ){    /* path name ÆèÅo */
  301.         if( path[i] == '\\' || path[i] == ':' )break;
  302.     }
  303.     for( k=0 ; k<13 ; k++ ){
  304.         path[i+1+k] = name[k];
  305.         if( name[k] == (char)0 )break;
  306.     }
  307.     return 0;
  308. }
  309.  
  310. movfile( name, namemov )
  311. char name[], namemov[];
  312. {
  313.     int i;
  314.  
  315.     for( i=0 ; i<76 ; i++ ){
  316.         namemov[i] = name[i];
  317.         if( name[i] == '.' || name[i] == (char)0 )goto mov01;
  318.     }
  319.     return 55;        /* bad file name */
  320. mov01:    if( i == 0 )return 55;
  321.     namemov[i++] = '.'; namemov[i++] = 'M'; namemov[i++] = 'O';
  322.     namemov[i++] = 'V'; namemov[i] = (char)0;
  323.     return 0;
  324. }
  325.  
  326. /* time to frame */
  327.  
  328. cd_play_frame( time )
  329. char *time;
  330. {
  331.     return BYTE(time+2) + BYTE(time+1)*75 + BYTE(time)*75*60;
  332. }
  333.  
  334. /* frame to time */
  335.  
  336. cd_play_time( time, s )
  337. char time[];
  338. int s;
  339. {
  340.     int temp;
  341.  
  342.     time[2] = (char)(s % 75);
  343.     temp = s / 75;
  344.     time[1] = (char)(temp % 60);
  345.     time[0] = (char)(temp / 60);
  346.     return 0;
  347. }
  348.  
  349. cd_play( time, count )
  350. int time[], count;
  351. {
  352.     int type, s, e, i, start, end;
  353.     char track[99][3];
  354.     char total[3];
  355.     char t[3], st[3], en[3], t1[3], t2[3];
  356.  
  357.     if( cdr_mstop(0) == 0 )goto cd01;
  358.         /* 1ë±é╛é»é╢éßé╛é▀é╚é▒é╞éαéáéΘ !! */
  359. cd01:
  360.     for( i=0 ; i<4 ; i++ )
  361.     {
  362.         if( cdr_cdinfo(
  363.             0, &type, &s, &e,
  364.             (struct TIMEADRS *)(track), (struct TIMEADRS *)(total)
  365.         ) == 0 )goto cd02;
  366.     }
  367.     return -1;
  368. cd02:    ;
  369.  
  370. /*    for cd data check    */
  371. /*
  372.     char out[10];
  373.     EGB_writePage(ework,1);
  374.     EGB_clearScreen( ework );
  375.     for( j=0 ; j<8 ; j++ ){
  376.         for( i=0 ; i<3 ; i++ ){
  377.             itochar( (int)track[j][i], 3, out );
  378.             gprint( out, i*32, j*40+20 );
  379.         }
  380.     }
  381.     itochar( type, 3, out );
  382.     gprint( out, 0, 400 );
  383.     itochar( s, 3, out );
  384.     gprint( out, 50, 400 );
  385.     itochar( e, 3, out );
  386.     gprint( out, 100, 400 );
  387.     for( i=0 ; i<3 ; i++ ){
  388.         itochar( (int)total[i], 3, out );
  389.         gprint( out, i*32, 450 );
  390.     }
  391.     mouse(0);
  392. */
  393.  
  394.     t[0] = (char)time[1];
  395.     t[1] = (char)time[2];
  396.     t[2] = (char)time[3];
  397.     start = cd_play_frame( t );
  398.     if( time[0] < 1 )time[0] = 1;
  399.     if( time[0] <= e ){
  400.         for( i=time[0]-1 ; i<e ; i++ ){
  401.             if( (BYTE( track[i] ) & 0x80) == 0 )break;
  402.         }
  403.         if( i == e )return -1;
  404.         start = start + cd_play_frame( track[i] );
  405.     }
  406.     else start = cd_play_frame( total ) - 1;
  407.  
  408.     t[0] = (char)time[5];
  409.     t[1] = (char)time[6];
  410.